// 对axios进行二次封装
import axios from 'axios'
import { getToken, removeToken } from './token'
// import { refreshTokenAPI } from '@/api'
import router from '@/router'
import { Notify } from 'vant'

const request = axios.create({
  baseURL: 'http://geek.itheima.net', // 基地址
  // baseURL: 'http://toutiao.itheima.net', // 基地址
  timeout: 8000
})

// 请求拦截器
request.interceptors.request.use(function (config) {
  console.log(config, 'config')
  // 统一携带请求头
  // 如果request那边传了请求头和Authorization 证明那边要自定义, 所以这里不能进去 会被覆盖
  // 只有本次请求头里没有Authorization字段, 我才需要携带上token
  // if (config.headers.Authorization === undefined) {
  const token = getToken()
  config.headers.Authorization = `Bearer ${token}`
  // }
  return config
}, function (error) {
  return Promise.reject(error)
})

// 响应拦截器
request.interceptors.response.use(function (response) {
  return response
}, async function (error) {
// 对响应错误做点什么
  if (error.response.status === 401) {
    // 身份认证失败
    // 续签方式1: 重新登录, 拿到新的token - 用户感知
    // router.replace('/login') // 切换路由
    removeToken()
    // this不再是Vue实例对象
    // this.$router 和 router对象 是一样的
    router.replace('/login')
    Notify({ type: 'danger', message: '身份过期,请重新登录' })

    // 续签方式2: 用户无感知 -> 用代码直接刷新一个新的token回来
    // const res = await refreshTokenAPI()
    // console.log(res)
    // 保存token到本地
    // setToken(res.data.data.token)
    // error.config里请求头还带着错的token, 更新一下
    // error-> 逻辑页面(例如: 不感兴趣接口调用报的错) error.config是不感兴趣相关的参数对象
    // error.config.headers.Authorization = 'Bearer ' + res.data.data.token
    // 继续完成上一次未完成的401请求
    // return axios(error.config)
    // 把未完成的请求对象, 再装入回去, 重新发送一次请求
    // 原地新发起的Promise对象, 也要return到最开始第一次发起请求的逻辑页面
  }
  return Promise.reject(error)
})

// 拔高
export default ({ url, method, params, data, headers }) =>
  axios({
    url,
    data,
    params,
    method,
    headers
  })
